package net.johnpwood.android.standuptimer.test;
import net.johnpwood.android.standuptimer.Prefs;
import net.johnpwood.android.standuptimer.R;
import net.johnpwood.android.standuptimer.mock.StandupTimerMock;
import net.johnpwood.android.standuptimer.model.Team;
import android.content.Intent;
import android.graphics.Color;
import android.test.ActivityUnitTestCase;
import android.test.suitebuilder.annotation.MediumTest;
import android.view.KeyEvent;
import android.widget.Button;
import android.widget.TextView;
public class StandupTimerTest extends ActivityUnitTestCase<StandupTimerMock> {
private static final int DEFAULT_NUM_PARTICIPANTS = 2;
private static final int DEFAULT_MEETING_LENGTH = 60 * 5;
private StandupTimerMock a = null;
public StandupTimerTest() {
super(StandupTimerMock.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.putExtra("meetingLength", 5);
intent.putExtra("numParticipants", 5);
intent.putExtra("teamName", "Test Team");
a = startActivity(intent, null, null);
}
@MediumTest
public void test_onResume_acquires_wake_lock_and_starts_timer() {
assertFalse(a.isWakeLockAcquired());
assertFalse(a.isTimerActive());
a.onResume();
assertTrue(a.isWakeLockAcquired());
assertTrue(a.isTimerActive());
}
@MediumTest
public void test_onPause_cancels_timer_and_releases_wake_lock() {
a.onResume();
assertTrue(a.isWakeLockAcquired());
assertTrue(a.isTimerActive());
a.onPause();
assertFalse(a.isWakeLockAcquired());
assertFalse(a.isTimerActive());
}
@MediumTest
public void test_onPause_saves_state_if_not_finished() {
a.setRemainingMeetingSeconds(123);
a.setTotalParticipants(456);
a.setCurrentIndividualStatusSeconds(43);
a.setMeetingStartTime(123456789);
a.setIndividualStatusEndTime(666777888);
a.setQuickestStatus(789);
a.setLongestStatus(999);
a.onPause();
a.loadState();
assertEquals(123, a.getRemainingMeetingSeconds());
assertEquals(456, a.getTotalParticipants());
assertEquals(43, a.getCurrentIndividualStatusSeconds());
assertEquals(123456789, a.getMeetingStartTime());
assertEquals(123456789, a.getIndividualStatusStartTime());
assertEquals(666777888, a.getIndividualStatusEndTime());
assertEquals(789, a.getQuickestStatus());
assertEquals(999, a.getLongestStatus());
}
@MediumTest
public void test_onPause_clears_state_if_finished() {
a.setRemainingMeetingSeconds(123);
a.setTotalParticipants(456);
a.setCurrentIndividualStatusSeconds(43);
a.setMeetingStartTime(123456789);
a.setIndividualStatusEndTime(666777888);
a.setQuickestStatus(789);
a.setLongestStatus(999);
clickFinishedButton();
a.onPause();
a.loadState();
assertEquals(DEFAULT_MEETING_LENGTH, a.getRemainingMeetingSeconds());
assertEquals(DEFAULT_NUM_PARTICIPANTS, a.getTotalParticipants());
assertEquals(0, a.getCurrentIndividualStatusSeconds());
assertTrue(a.getMeetingStartTime() > (System.currentTimeMillis() - 1000) && a.getMeetingStartTime() < System.currentTimeMillis());
assertTrue(a.getIndividualStatusStartTime() > (System.currentTimeMillis() - 1000) && a.getIndividualStatusStartTime() < System.currentTimeMillis());
assertEquals(0, a.getIndividualStatusEndTime());
assertEquals(Integer.MAX_VALUE, a.getQuickestStatus());
assertEquals(0, a.getLongestStatus());
}
@MediumTest
public void test_timer_is_stopped_when_back_button_is_pressed() {
a.onKeyDown(KeyEvent.KEYCODE_BACK, new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACK));
a.onPause();
a.loadState();
assertEquals(DEFAULT_MEETING_LENGTH, a.getRemainingMeetingSeconds());
assertEquals(DEFAULT_NUM_PARTICIPANTS, a.getTotalParticipants());
assertTrue(a.isFinished());
}
@MediumTest
public void test_click_next_button_advances_to_next_participant_and_resets_individual_timer_and_calculates_individual_stats() {
a.setLongestStatus(120);
a.setQuickestStatus(60);
a.setCurrentIndividualStatusSeconds(75);
a.setRemainingIndividualSeconds(4);
assertEquals(0, a.getCompletedParticipants());
clickNextButton();
assertEquals(a.getStartingIndividualSeconds(), a.getRemainingIndividualSeconds());
assertEquals(1, a.getCompletedParticipants());
assertEquals(0, a.getCurrentIndividualStatusSeconds());
assertEquals(120, a.getLongestStatus());
assertEquals(60, a.getQuickestStatus());
}
@MediumTest
public void test_new_longest_individual_status_determined_properly() {
a.clearState();
a.setLongestStatus(120);
a.setQuickestStatus(60);
a.setCurrentIndividualStatusSeconds(125);
a.setRemainingIndividualSeconds(4);
assertEquals(0, a.getCompletedParticipants());
clickNextButton();
assertEquals(a.getStartingIndividualSeconds(), a.getRemainingIndividualSeconds());
assertEquals(1, a.getCompletedParticipants());
assertEquals(0, a.getCurrentIndividualStatusSeconds());
assertEquals(125, a.getLongestStatus());
assertEquals(60, a.getQuickestStatus());
}
@MediumTest
public void test_new_quickest_individual_status_determined_properly() {
a.clearState();
a.setLongestStatus(120);
a.setQuickestStatus(60);
a.setCurrentIndividualStatusSeconds(55);
a.setRemainingIndividualSeconds(4);
assertEquals(0, a.getCompletedParticipants());
clickNextButton();
assertEquals(a.getStartingIndividualSeconds(), a.getRemainingIndividualSeconds());
assertEquals(1, a.getCompletedParticipants());
assertEquals(0, a.getCurrentIndividualStatusSeconds());
assertEquals(120, a.getLongestStatus());
assertEquals(55, a.getQuickestStatus());
}
@MediumTest
public void test_click_next_button_assigns_remaining_time_to_individual_when_remaining_meeting_time_less_than_starting_individual_time() {
a.setStartingIndividualSeconds(60);
a.setRemainingMeetingSeconds(4);
clickNextButton();
assertEquals(4, a.getRemainingIndividualSeconds());
}
@MediumTest
public void test_individual_timer_is_disabled_when_there_are_no_more_participants() throws Throwable {
a.setCompletedParticipants(4);
a.setTotalParticipants(5);
clickNextButton();
// Test is not executing the thread that updates the UI, so do it manually
a.disableIndividualTimer();
assertEquals(0, a.getRemainingIndividualSeconds());
assertTrue(0L != a.getIndividualStatusEndTime());
TextView participantNumber = (TextView) a.findViewById(R.id.participant_number);
assertEquals(a.getString(R.string.individual_status_complete), participantNumber.getText());
TextView individualTimeRemaining = (TextView) a.findViewById(R.id.individual_time_remaining);
assertEquals("0:00", individualTimeRemaining.getText());
assertEquals(Color.GRAY, individualTimeRemaining.getTextColors().getDefaultColor());
Button nextButton = (Button) a.findViewById(R.id.next_button);
assertFalse(nextButton.isClickable());
assertEquals(Color.GRAY, nextButton.getTextColors().getDefaultColor());
}
@MediumTest
public void test_meeting_is_not_finished_when_all_participants_are_done() {
a.setCompletedParticipants(4);
clickNextButton();
assertFalse(a.isFinished());
}
@MediumTest
public void test_click_finish_button_ends_the_timer_and_clears_state() {
clickFinishedButton();
a.onPause();
a.loadState();
assertEquals(DEFAULT_MEETING_LENGTH, a.getRemainingMeetingSeconds());
assertEquals(DEFAULT_NUM_PARTICIPANTS, a.getTotalParticipants());
assertTrue(a.isFinished());
assertTrue(isFinishCalled());
}
@MediumTest
public void test_timer_is_changed_to_yellow_and_warning_sound_is_played_when_individual_timer_reaches_warning_time() {
Prefs.setPlaySounds(a, true);
Prefs.setWarningTime(a, 15);
a.setRemainingIndividualSeconds(16);
a.updateTimerValues();
a.updateDisplay();
TextView individualTimeRemaining = (TextView) a.findViewById(R.id.individual_time_remaining);
assertEquals(Color.YELLOW, individualTimeRemaining.getTextColors().getDefaultColor());
assertTrue(a.wasWarningSoundPlayed());
}
@MediumTest
public void test_timer_is_changed_to_red_and_finished_sound_is_played_when_individual_timer_runs_out() {
Prefs.setPlaySounds(a, true);
a.setRemainingIndividualSeconds(1);
a.updateTimerValues();
a.updateDisplay();
TextView individualTimeRemaining = (TextView) a.findViewById(R.id.individual_time_remaining);
assertEquals(Color.RED, individualTimeRemaining.getTextColors().getDefaultColor());
assertTrue(a.wasFinishedSoundPlayed());
}
@MediumTest
public void test_total_time_remaining_is_changed_to_yellow_it_reaches_the_warning_time() {
Prefs.setWarningTime(a, 15);
a.setRemainingMeetingSeconds(16);
a.updateTimerValues();
a.updateDisplay();
TextView totalTimeRemaining = (TextView) a.findViewById(R.id.total_time_remaining);
assertEquals(Color.YELLOW, totalTimeRemaining.getTextColors().getDefaultColor());
}
@MediumTest
public void test_total_time_remaining_is_changed_to_red_when_time_runs_out() {
a.setRemainingMeetingSeconds(1);
a.updateTimerValues();
a.updateDisplay();
TextView totalTimeRemaining = (TextView) a.findViewById(R.id.total_time_remaining);
assertEquals(Color.RED, totalTimeRemaining.getTextColors().getDefaultColor());
}
@MediumTest
public void test_warning_sound_is_not_played_if_sounds_are_disabled() {
Prefs.setWarningTime(a, 15);
Prefs.setPlaySounds(a, false);
a.setRemainingIndividualSeconds(16);
a.updateTimerValues();
assertFalse(a.wasWarningSoundPlayed());
}
@MediumTest
public void test_finished_sound_is_not_played_if_sounds_are_disabled() {
Prefs.setPlaySounds(a, false);
a.setRemainingIndividualSeconds(1);
a.updateTimerValues();
assertFalse(a.wasFinishedSoundPlayed());
}
@MediumTest
public void test_meeting_stats_are_stored_when_finish_is_clicked() {
a.setMeetingStartTime(System.currentTimeMillis());
a.setCompletedParticipants(5);
a.setIndividualStatusEndTime(System.currentTimeMillis());
a.setQuickestStatus(60);
a.setLongestStatus(120);
a.setTeam(new Team("Test team"));
clickFinishedButton();
assertTrue(a.wasPersistMeetingCalled());
}
@MediumTest
public void test_individual_status_end_time_is_set_if_finish_is_clicked_early() {
a.setMeetingStartTime(System.currentTimeMillis());
a.setCompletedParticipants(5);
a.setQuickestStatus(60);
a.setLongestStatus(120);
a.setTeam(new Team("Test team"));
clickFinishedButton();
assertTrue(0L != a.getIndividualStatusEndTime());
assertTrue(a.wasPersistMeetingCalled());
}
@MediumTest
public void test_finishing_a_meeting_with_no_team_specified_doesnt_try_to_persist_the_results() {
a.setTeam(null);
clickFinishedButton();
assertFalse(a.wasPersistMeetingCalled());
}
private void clickFinishedButton() {
((Button) a.findViewById(R.id.finished_button)).performClick();
}
private void clickNextButton() {
((Button) a.findViewById(R.id.next_button)).performClick();
}
}